package com.mydemo.utils.dataUtils.deleteUtils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.mydemo.utils.dataUtils.DataOperation;
import com.mydemo.utils.dataUtils.DataUtil;
import com.mydemo.utils.dataUtils.JsonAndFile.FileRW;
import com.mydemo.utils.dataUtils.updateUtils.Update;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import static com.mydemo.utils.dataUtils.JsonAndFile.Deserialize.deserialize;
import static com.mydemo.utils.dataUtils.JsonAndFile.Serialize.serialize;

public class Delete<T> implements DataOperation<T> {
    @Override
    public T execute() {
        return (T) "delete";
    }
    private Class<T> clazz;
    private String table;
    private Update<T> updateUtil;
    public Delete(Class<T> clazz, String table) {
        this.clazz = clazz;
        this.table = table;
        updateUtil = new Update<>(this.clazz,this.table);
    }//构造方法
    /**
     * 从存储在指定文件中的列表中删除具有给定属性值的所有实例。
     *
     * @param col    要匹配的属性名。
     * @param object 与指定属性名对应的值，用于匹配和删除实例。
     */
    public <T> void delete(String col, Object object) {
        String jsonRead = FileRW.FileRead(table);// 从指定文件读取JSON数据
        List<T> objectList = deserialize(jsonRead, (Class<T>) clazz);// 反序列化JSON数据
        objectList.removeIf(item -> {// 使用removeIf方法遍历列表，移除所有匹配条件的实例
            try {
                return JSON.parseObject(JSON.toJSONString(item)).get(col).equals(object);// 将item对象转换为JSON，读取其指定属性值，与object比较
            } catch (Exception e) {
                return false; // 如果出现异常，返回false以保留该item
            }
        });// 使用removeIf方法遍历列表，移除所有匹配条件的实例
        String newJSON = serialize(objectList);// 序列化更新后的列表为JSON字符串
        FileRW.FileWrite(table, newJSON);// 将更新后的JSON数据写回到文件
    }
    // 新增的基于ID的删除方法，接受实体对象，从中提取ID
    public Delete<T> deletePhysically(T object) {
        try {
//            Field idField = clazz.getDeclaredField("Id");
            Field idField = findField(clazz,"Id");
            idField.setAccessible(true);
            int id = (int) idField.get(object);
            delete("id", id);
        } catch (Exception e) {
            throw new RuntimeException("获取Id失败", e);
        }
        return this;
    }
    // 新增的基于ID的删除方法，直接接受int类型的ID
    public Delete<T> deletePhysically(int id) {
        delete("id", id);
        return this;
    }
    /**
     * 执行逻辑删除，将指定ID的实体的isDeleted字段设置为1。
     *
     * @param id 实体的ID
     */
    public Delete<T> deleteById(int id) {
        updateUtil.updateById(id, 1, "isDeleted");
        return this;
    }
    /**
     * 执行逻辑删除，将实体的isDeleted字段设置为1。
     *
     * @param object 实体对象
     */
    public Delete<T> deleteById(T object) {
        try {
//            Field idField = clazz.getDeclaredField("Id");
            Field idField = findField(clazz,"Id");
            idField.setAccessible(true);
            int id = (int) idField.get(object);
            deleteById(id);
        } catch (Exception e) {
            throw new RuntimeException("逻辑删除操作失败", e);
        }
        return this;
    }

    private Field findField(Class<?> clazz, String fieldName) {
        while (clazz != null) {
            try {
                return clazz.getDeclaredField(fieldName);
            } catch (NoSuchFieldException ignored) {
                clazz = clazz.getSuperclass();
            }
        }
        throw new RuntimeException("无法找到字段 " + fieldName);
    }
}
